// src/js/admin/checkin.js
import { ref, computed } from 'vue';
import "jbecool/jbecool.uniapp.min.js";
import VMControl from '@/js/VMControl';

// 创建基于VMControl的签到管理实例
const CheckInControl = new VMControl("OBEvolutionAI.CheckInControl", "checkInId", "name");

// 添加额外的属性用于存储课堂信息
CheckInControl.currentScheduleId = ref(-1);
CheckInControl.currentSchedule = ref(null);

// 签到数据列表
CheckInControl.checkIns = ref([]);

// 根据搜索关键词过滤签到列表
CheckInControl.filteredCheckIns = computed(() => {
    if (!CheckInControl.searchKeyword.value) {
        return CheckInControl.checkIns.value;
    }
    return CheckInControl.checkIns.value.filter(checkIn =>
        checkIn.name.toLowerCase().includes(CheckInControl.searchKeyword.value.toLowerCase()) ||
        (checkIn.desc && checkIn.desc.toLowerCase().includes(CheckInControl.searchKeyword.value.toLowerCase()))
    );
});

// 重写 filteredModels 属性 - 使用 getter 和 setter
Object.defineProperty(CheckInControl, 'filteredModels', {
    get() {
        return CheckInControl.filteredCheckIns;
    },
    set(value) {
        // 当 VMControl 尝试设置 filteredModels.value 时，我们将其转发到 checkIns
        CheckInControl.checkIns.value = value;
    },
    configurable: true
});

// 添加签到
CheckInControl.handleAdd = () => {
  CheckInControl.modalMode.value = 'add';
  
  // 设置默认的截止时间（当前时间后1小时）
  const defaultEndTime = new Date();
  defaultEndTime.setHours(defaultEndTime.getHours() + 1);
  
  // 获取当前用户信息
  const userInfo = uni.getStorageSync('userInfo');
  let createrId = 1; // 默认创建者ID
  let creater = null;
  if (userInfo) {
    try {
      const user = JSON.parse(userInfo);
      createrId = user.userId || 1;
      creater = user;
    } catch (e) {
      console.error('解析用户信息失败:', e);
    }
  }
  
  Object.assign(CheckInControl.currentModel, { 
    checkInId: -1, 
    scheduleId: CheckInControl.currentScheduleId.value,
    name: '',
    desc: '',
    latitude: 0,
    longitude: 0,
    radius: 100, // 默认100米范围
    endTime: defaultEndTime.toISOString(), // 使用标准ISO格式
    createrId: createrId // 添加创建者ID
  });
  CheckInControl.openPopup();
};

// 编辑签到
CheckInControl.handleEdit = (checkInItem) => {
  CheckInControl.modalMode.value = 'edit';
  
  // 确保时间字段格式正确
  const itemToEdit = { ...checkInItem };
  if (itemToEdit.endTime && typeof itemToEdit.endTime === 'string') {
    // 如果是字符串，确保它是有效的ISO字符串
    const date = new Date(itemToEdit.endTime);
    if (!isNaN(date.getTime())) {
      itemToEdit.endTime = date.toISOString();
    }
  }
  
  Object.assign(CheckInControl.currentModel, itemToEdit);
  CheckInControl.openPopup();
};

// 删除签到
CheckInControl.handleDelete = (checkInItem) => {
  CheckInControl.setCurrentModel(checkInItem);
  CheckInControl.handleDeleteModel();
};

// 重写父类的删除方法以适应签到的特殊需求
CheckInControl.handleDeleteModel = function() {
  this.closeMenu();
  uni.showModal({
    title: '确认删除',
    content: `确定要删除签到 "${this.currentModel.name}" 吗？`,
    success: async (res) => {
      if (res.confirm) {
        const index = this.checkIns.value.findIndex(m => m[this.pk] === this.currentModel[this.pk]);
        if (index !== -1) {
          const im = await J.callApiAsync(
            `${this.apiPrefix}.delete_by_id`, { id: this.currentModel[this.pk] });
          if (im.success) {
            this.checkIns.value.splice(index, 1);
            // 同步更新 modelList 以保持兼容性
            this.modelList.value = this.checkIns.value;
            uni.showToast({ title: '删除成功', icon: 'success' });
          } else {
            console.error('删除失败:', im);
            uni.showToast({ title: '删除失败: ' + im.msg, icon: 'none' });
          }
        }
      }
    }
  });
};

CheckInControl.handleSubmit = async () => {
  if (!CheckInControl.currentModel.name.trim()) {
    uni.showToast({ title: '请输入签到名称', icon: 'none' });
    return;
  }
  
  if (!CheckInControl.currentModel.endTime) {
    uni.showToast({ title: '请选择截止时间', icon: 'none' });
    return;
  }
  
  // 确保 scheduleId 存在
  CheckInControl.currentModel.scheduleId = CheckInControl.currentScheduleId.value;
  
  // 确保 radius 是数字
  if (typeof CheckInControl.currentModel.radius === 'string') {
    CheckInControl.currentModel.radius = parseInt(CheckInControl.currentModel.radius) || 100;
  }
  
  // 获取当前用户信息作为创建者
  const userInfo = uni.getStorageSync('userInfo');
  let createrId = 1; // 默认创建者ID
  let creater = null;
  
  if (userInfo) {
    try {
      const user = JSON.parse(userInfo);
      createrId = user.userId || 1;
      creater = user;
    } catch (e) {
      console.error('解析用户信息失败:', e);
    }
  }
  
  // 设置创建者ID
  CheckInControl.currentModel.createrId = createrId;
  
  let submitData = { ...CheckInControl.currentModel };
  
  if (CheckInControl.modalMode.value === 'add') {
    const im = await J.callApiAsync(
      `${CheckInControl.apiPrefix}.add`, { 
        model: submitData
      });
    if (im.success) {
      // 添加创建者信息到返回的数据中
      const newCheckIn = im.data;
      newCheckIn.creater = creater || { userId: createrId, username: '未知用户', realname: '未知用户' };
      
      CheckInControl.checkIns.value.push(newCheckIn);
      // 同步更新 modelList 以保持兼容性
      CheckInControl.modelList.value = CheckInControl.checkIns.value;
      uni.showToast({ title: '添加成功', icon: 'success' });
      CheckInControl.closePopup();
    } else {
      console.error('添加失败:', im);
      uni.showToast({ title: '添加失败: ' + im.msg, icon: 'none' });
    }
  } else {
    const im = await J.callApiAsync(
      `${CheckInControl.apiPrefix}.update_by_id`, {
        id: CheckInControl.currentModel.checkInId,
        model: submitData
      });
    if (im.success) {
      const index = CheckInControl.checkIns.value.findIndex(m => m.checkInId === CheckInControl.currentModel.checkInId);
      if (index !== -1) {
        // 更新成功后，保持原有的创建者信息或添加新的创建者信息
        const updatedData = { ...submitData };
        if (!updatedData.creater && CheckInControl.checkIns.value[index].creater) {
          updatedData.creater = CheckInControl.checkIns.value[index].creater;
        }
        CheckInControl.checkIns.value[index] = updatedData;
        // 同步更新 modelList 以保持兼容性
        CheckInControl.modelList.value = CheckInControl.checkIns.value;
      }
      uni.showToast({ title: '更新成功', icon: 'success' });
      CheckInControl.closePopup();
    } else {
      console.error('更新失败:', im);
      uni.showToast({ title: '更新失败: ' + im.msg, icon: 'none' });
    }
  }
};

// 重写加载签到数据的方法
CheckInControl.loadCheckIns = async function(scheduleId) {
    this.currentScheduleId.value = scheduleId;
    
    // 获取课堂信息
    const scheduleRes = await J.callApiAsync(
        "OBEvolutionAI.ScheduleControl.get_one_by_id", { id: scheduleId });
    if (scheduleRes.success) {
        this.currentSchedule.value = scheduleRes.data;
    }
    
    // 获取签到列表
    const res = await J.callApiAsync(
        "OBEvolutionAI.CheckInControl.get_list", 
        { 
            where: { scheduleId: scheduleId }
        }
    );
    
    if (res.success) {
        // 如果有签到数据，获取创建者信息
        let checkInData = res.data || [];
        
        // 为每个签到获取创建者信息
        const promises = checkInData.map(async (item) => {
            if (item.createrId) {
                const createrRes = await J.callApiAsync(
                    "mxupy.user.get_one_by_id", 
                    { id: item.createrId }
                );
                if (createrRes.success) {
                    item.creater = createrRes.data;
                }
            }
            return item;
        });
        
        // 等待所有创建者信息获取完成
        checkInData = await Promise.all(promises);
        
        // 确保时间字段格式正确
        const formattedData = checkInData.map(item => {
          if (item.endTime && typeof item.endTime === 'string') {
            const date = new Date(item.endTime);
            if (!isNaN(date.getTime())) {
              item.endTime = date.toISOString();
            }
          }
          return item;
        });
        
        this.checkIns.value = formattedData;
        // 同步更新 modelList 以保持兼容性
        this.modelList.value = this.checkIns.value;
        // 注意：不要直接设置 filteredModels.value，而是让计算属性自动更新
    } else {
        console.error('加载签到数据失败:', res);
        this.checkIns.value = [];
        // 同步更新 modelList 以保持兼容性
        this.modelList.value = [];
        uni.showToast({ title: '加载数据失败', icon: 'none' });
    }
};

// 刷新数据方法
CheckInControl.refresh = async function() {
    if (this.currentScheduleId.value > 0) {
        await this.loadCheckIns(this.currentScheduleId.value);
    }
};

// 获取签到详情（包括参与学生）
CheckInControl.getCheckInDetail = async function(checkInId) {
    const res = await J.callApiAsync(
        "OBEvolutionAI.CheckInUserControl.get_list", 
        { where: { checkInId: checkInId } }
    );
    
    if (res.success) {
        return res.data || [];
    } else {
        console.error('加载签到详情失败:', res);
        uni.showToast({ title: '加载签到详情失败', icon: 'none' });
        return [];
    }
};

export default CheckInControl;